#pragma once
#include<spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <gflags/gflags.h>
#include <string>

DEFINE_bool(run_mode, false, "程序的运行模式，false-调试； true-发布；");
DEFINE_string(log_file, "", "发布模式下，用于指定日志的输出文件");
DEFINE_int32(log_level, 0, "发布模式下，用于指定日志输出等级");

std::shared_ptr<spdlog::logger> g_default_logger;

void init_logger(bool mode,const std::string& file,int32_t level)
{
    if(mode==false)
    {
        //创建异步日志器（标准输出）
        g_default_logger=spdlog::stdout_color_mt("default-logger");
        //自动刷新等级
        g_default_logger->set_level(spdlog::level::level_enum::trace);
        //记录日志刷新等级，低于该等级被忽略
        g_default_logger->flush_on(spdlog::level::level_enum::trace);
    }
    else
    {
        //创建异步日志器（文件）
        g_default_logger=spdlog::basic_logger_mt("default-logger",file);
        //自动刷新等级
        g_default_logger->set_level(static_cast<spdlog::level::level_enum>(level));
        //记录日志刷新等级，低于该等级被忽略
        g_default_logger->flush_on(static_cast<spdlog::level::level_enum>(level));
    }
    //设置日志输出格式
    g_default_logger->set_pattern("[%n][%H:%M:%S][%t][%-8l]%v");
}

#define TRACE(format, ...) g_default_logger->trace(std::string("[{}{}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__);
#define DEBUG(format, ...) g_default_logger->debug(std::string("[{}{}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__);
#define INFO(format, ...) g_default_logger->info(std::string("[{}{}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__);
#define WARN(format, ...) g_default_logger->warn(std::string("[{}{}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__);
#define ERROR(format, ...) g_default_logger->error(std::string("[{}{}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__);
#define FATAL(format, ...) g_default_logger->critical(std::string("[{}{}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__);